package com.dxf.chepter07

/**
 * scala嵌套类 类似 java中的 内部类
 *
 *
 * java 5大成员
 * 1 属性
 * 2 方法
 * 3 内部类
 * 4 构造器
 * 5 代码块
 * java中内部类当做一个属性来处理
 *
 * ===================================================
 *
 *
 *
 */
object T73_嵌套类_内部类 {

  def main(args: Array[String]): Unit = {
    val outer1 = new ScalaOuterClass
    val outer2 = new ScalaOuterClass

    val inner1 = new outer1.ScalaInnerClass
    val inner2 = new outer1.ScalaInnerClass

    inner1.info()
    //别名使用
    val outer22 = new ScalaOuterClass2
    val inner22 = new outer22.ScalaInnerClass2
    inner22.info()
    // ==============
    //投影
    inner1.test(inner1)
    inner2.test(inner2)
    inner1.test(inner2)
    inner1.test2(inner2)



  }
}

//方式一 内部类访问外部类属性 外部类名.this.xxx
class ScalaOuterClass {
  var name = "scoot"
  private var sal = 30000.9


  class ScalaInnerClass { //成员内部类
    def info(): Unit = {
      //内部类调用外部类的属性
      //ScalaOuterClass.this 相当于ScalaOuterClass类的一个实例
      println("name=" + ScalaOuterClass.this.name + "age= " + ScalaOuterClass.this.sal)
    }

    //投影 ScalaOuterClass#
    def test(ic: ScalaOuterClass#ScalaInnerClass): Unit = {
      println(ic)
    }

    def test2(ic: ScalaInnerClass): Unit = {
      println(ic)
    }
  }

}

//方式er 内部类访问外部类属性 使用别名
class ScalaOuterClass2 {
  myOuter => //别名 myOuter可以看做是外部类的实例
  class ScalaInnerClass2 { //成员内部类
    def info(): Unit = {
      //内部类调用外部类的属性
      //ScalaOuterClass.this 相当于ScalaOuterClass类的一个实例
      println("name=" + myOuter.name + "age= " + myOuter.sal)
    }


  }

  //成员变量必须在别名下方
  var name = "scoot"
  private var sal = 30000.9

}


object ScalaOuterClass { //伴生对象
  class ScalaStaticInnerClass { //静态内部类


  }

}